/* 构造函数和析构函数:
 * 函数名字和类名相同，且没有返回值。
 *
 * 没有提供任何构造函数的时候，会自动生成默认构造和默认析构，为空函数。
 *
 * OOP实现一个顺序栈
 *
 * */
#include <iostream>
using namespace std;

class SeqStack{
private:
    int *_pstack;       //动态开辟数组，存储顺序栈的元素
    int _top;           //指向栈顶元素的位置
    int _size;          //数组扩容的总大小

    void resize(){
        int *ptmp=new int [_size*2];
        for (int i = 0; i < _size; ++i) {
            ptmp[i]= _pstack[i];
        }
        delete[] _pstack;
        _pstack=ptmp;
        _size*=2;
    }
public:
    //构造函数可以带参数，所以构造函数可以有多个重载
    SeqStack(int size=10){
        _pstack=new int [size];
        _top=-1;
        _size=size;
        cout<<"SeqStack()"<<endl;
    }

    //析构函数不带参数，所以只有一个析构函数
    ~SeqStack(){
        delete[] _pstack;
        _pstack= nullptr;
        cout<<endl<<"~SeqStack()"<<endl;
    };

    void push(int val){
        if (full())
            resize();
        _pstack[++_top]=val;
    }

    void pop(){
        if (empty())
            return;
        --_top;
    }

    int top(){
        return _pstack[_top];
    }

    bool empty(){
        return _top==-1;
    }

    bool full(){
        return _top==_size-1;
    }
};

int main(){
    SeqStack s;

    for (int i = 0; i < 15; ++i) {
        s.push(rand()%100);
    }

    while (!s.empty()){
        cout<<s.top()<<" ";
        s.pop();
    }

    return 0;
}